package com.hspedu.InnerClass;

/**
 * @Author Stringzhua
 * @Date 2024/3/6 15:07
 * description:局部内部类
 * 演示局部内部类的使用
 * 局部内部类是定义在外部类的局部位置,比如方法中,并且有类名
 * 6.外部其他类不能访问局部内部类  【原因:局部内部类地位是一个局部变量】
 */
public class LocalInnerClass {
    public static void main(String[] args) {
        //演示
        Outer02 outer02 = new Outer02();
        outer02.m1();
        System.out.println("outer02的hashCode() = " + outer02.hashCode());

    }
}

class Outer02 {//外部类
    private int n1 = 100;

    private void m2() {
        System.out.println("Outer的m2()...");
    }//私有方法

    public void m1() {//方法
        //1.局部内部类是定义在外部类的局部位置,通常在方法中
        //3.不能添加访问修饰符,但是可以使用final修饰
        //4.作用域:仅仅定义在它的方法或代码块中
        String name = "xxx";
        final class Inner02 {//局部内部类(本质仍然是一个类)
            //2.可以直接访问外部类的所有成员,包括私有的
            private int n1 = 800;

            public void f1() {
                //5.局部内部类可以直接访问外部类的成员,比如下面 外部类n1和m2()
                //7.如果外部类和局部内部类的成员重名时,默认遵循就近原则
                //如果想访问外部类的成员,则可以使用:
                //外部类名.this.成员
                //去访问
                //解读:Outer02.this
                //本质就是外部类的对象,即哪个对象调用了m1方法,Outer02.this 就指向哪个对象
                System.out.println("外部类n2=" + Outer02.this.n1);//800
                System.out.println("Outer02.this.hashCode() = " + Outer02.this.hashCode());
                System.out.println("n1 = " + n1);//100
                m2();
                System.out.println("name = " + name);
            }
        }
        //6.外部类在方法中可以创建Inner02的对象实例,然后调用方法即可
        Inner02 inner02 = new Inner02();
        inner02.f1();
//        class Inner03 extends Inner02{}//局部内部类不想被继承,可以在局部内部类前用final修饰

        {
            //代码块
            class Inner03 {

            }
        }
    }
}
